/*	--- JDBC连接池 --- 

我们在讲多线程的时候说过，创建线程是一个昂贵的操作，如果有大量的小任务需要执行，并且频繁地创建和销毁线程，实际上会消耗大量的系统资源，往往创建和消耗线程所耗费的时间比执行任务的时间还长，所以，为了提高效率，可以用线程池。

类似的，在执行JDBC的增删改查的操作时，如果每一次操作都来一次打开连接，操作，关闭连接，那么创建和销毁JDBC连接的开销就太大了。为了避免频繁地创建和销毁JDBC连接，我们可以通过连接池（Connection Pool）复用已经创建好的连接。

JDBC连接池有一个标准的接口javax.sql.DataSource，注意这个类位于Java标准库中，但仅仅是接口。要使用JDBC连接池，我们必须选择一个JDBC连接池的实现。常用的JDBC连接池有：

	· HikariCP
	· C3P0
	· BoneCP
	· Druid



目前使用最广泛的是HikariCP。

我们以HikariCP为例，要使用JDBC连接池，先添加【HikariCP的依赖】如下：

<dependency>
    <groupId>com.zaxxer</groupId>
    <artifactId>HikariCP</artifactId>
    <version>2.7.1</version>
</dependency>




紧接着，我们需要创建一个DataSource实例，这个实例就是连接池：*/
HikariConfig config = new HikariConfig();

config.setJdbcUrl("jdbc:mysql://localhost:3306/test");
config.setUsername("root");
config.setPassword("password");
config.addDataSourceProperty("connectionTimeout", "1000"); // 连接超时: 1s
config.addDataSourceProperty("idleTimeout", "60000"); // 空闲超时: 60s
config.addDataSourceProperty("maximumPoolSize", "10"); // 最大连接数: 10

DataSource ds = new HikariDataSource(config);
	// DataSource 数据源


/*

注意【创建DataSource】也是一个【非常昂贵的操作】，所以通常【DataSource实例】总是作为【一个全局变量】存储，并贯穿【整个应用程序的生命周期】。


有了【连接池】以后，我们如何使用它呢？
和前面的代码类似，只是获取Connection时，把DriverManage.getConnection()改为ds.getConnection()：*/
try (Connection conn = ds.getConnection()) { // 在此获取连接
	//...
}// 在此"关闭"连接



/*

通过【连接池】获取【连接】时，并不需要【指定JDBC的相关URL、用户名、口令等信息】，因为这些【信息】已经存储在【连接池内部】了（创建HikariDataSource时传入的HikariConfig持有这些信息）。

一开始，连接池内部并没有连接，所以，第一次调用【ds.getConnection()】，会迫使【连接池】内部先创建一个【Connection】，再返回给【客户端】使用。


当我们调用【conn.close()方法】时（在try(resource){...}结束处），【不是真正“关闭”连接，而是释放到【连接池】中】，以便下次获取【连接】时能【直接返回】。


因此，【连接池】内部维护了【若干个Connection实例】，如果调用【ds.getConnection()】，就选择【一个空闲连接】，并标记它为“正在使用”然后返回，如果对【Connection】调用【close()】，那么就把【连接】再次标记为【“空闲”】从而等待【下次调用】。


这样一来，我们就通过【连接池】维护了【少量连接】，但可以频繁地执行【大量的SQL语句】。


通常【连接池】提供了【大量的参数】可以配置，例如，【维护的最小、最大活动连接数】，【指定一个连接在空闲一段时间后自动关闭】等，需要根据【应用程序的负载】合理地配置【这些参数】。


此外，【大多数连接池】都提供了【详细的实时状态】以便进行【监控】。



==========================================================


#	----- JDBC连接池 の 小结 ----- 


1. 【数据库连接池】是一种【复用Connection的组件】，它可以避免反复创建新连接，提高JDBC代码的运行效率；

2. 可以配置【连接池的详细参数】并【监控连接池】。

3. 【创建DataSource】也是一个【非常昂贵的操作】，所以通常【DataSource实例】总是作为【一个全局变量】存储，并贯穿【整个应用程序的生命周期】。


---------------


模版： */
HikariConfig config = new HikariConfig();

config.setJdbcUrl("jdbc:mysql://localhost:3306/test");
config.setUsername("root");
config.setPassword("password");
config.addDataSourceProperty("connectionTimeout", "1000"); // 连接超时: 1s
config.addDataSourceProperty("idleTimeout", "60000"); // 空闲超时: 60s
config.addDataSourceProperty("maximumPoolSize", "10"); // 最大连接数: 10

DataSource ds = new HikariDataSource(config);
	// DataSource 数据源

try (Connection conn = ds.getConnection()) { // 在此获取连接
	//...
}// 在此"关闭"连接
























